//这是电电侠项目给出的C#调用示例
//
//import net.bytebuddy.description.method.MethodDescription;
//import sun.net.www.http.HttpClient;
//
//import java.lang.reflect.Type;
//import java.nio.charset.StandardCharsets;
//import java.security.MessageDigest;
//import java.security.NoSuchAlgorithmException;
//import java.time.Instant;
//import java.util.*;
//
//public class ClientExample {
//    // 加密Key
//    private static final String KEY = "692d160086a746af80d1e3e4614ae29d";
//
//    // 请求例子
//    public static void requestExample() {
//        String url = "";
//
//        Map<String, String> data = new HashMap<>();
//        data.put("table", "v_cust");
//        data.put("path", "");
//        data.put("db", "config.aitconfig.datasource.u9db");
//
//        // 时间戳
//        long timestamp = Instant.now().getEpochSecond();
//
//        // 将参数字典的key值按字母顺序排序（按ASCII排序，例如a在b前面）
//        SortedMap<String, String> sortedParameterMap = convertToSortMap(data);
//
//        String signString = md5Encrypt(bodyString(sortedParameterMap));
//
//        signString = signString + timestamp + md5Encrypt(KEY);
//
//        // 签名
//        String sign = md5Encrypt(signString);
//
//        HttpClient client = new HttpClient();
//
//        client.setDefaultRequestHeader("Timestamp", String.valueOf(timestamp));
//        client.setDefaultRequestHeader("Sign", sign);
//
//        String content = serialize(data);
//
//        HttpClientResult result = client.put(url, content);
//    }
//
//    // 接收参数验签例子
//    public static void responseExample(String requestBody, String timestamp, String sign) {
//        Map<String, String> data = deserialize(requestBody);
//
//        // 将参数字典的key值按字母顺序排序（按ASCII排序，例如a在b前面）
//        SortedMap<String, String> sortedParameterMap = convertToSortMap(data);
//
//        String signString = md5Encrypt(bodyString(sortedParameterMap));
//
//        signString = signString + timestamp + md5Encrypt(KEY);
//
//        if (sign.equals(md5Encrypt(signString))) {
//            System.out.println("签名成功");
//        } else {
//            System.out.println("签名失败");
//        }
//    }
//
//    // Dictionary 转换 SortedMap
//    private static SortedMap<String, String> convertToSortMap(Map<String, String> map) {
//        SortedMap<String, String> result = new TreeMap<>(map);
//        return result;
//    }
//
//    // 生成签名所用字符串，值为空时不参与签名
//    private static String bodyString(SortedMap<String, String> sortedParameterMap) {
//        StringBuilder stringBuilder = new StringBuilder();
//        for (Map.Entry<String, String> entry : sortedParameterMap.entrySet()) {
//            String key = entry.getKey();
//            String value = entry.getValue();
//            if (!value.isEmpty()) {
//                stringBuilder.append(String.format("%s=%s&", key, value));
//            }
//        }
//        return stringBuilder.toString();
//    }
//
//    // MD5
//    private static String md5Encrypt(String input) {
//        try {
//            MessageDigest digest = MessageDigest.getInstance("MD5");
//            byte[] hash = digest.digest(input.getBytes(StandardCharsets.UTF_8));
//
//            StringBuilder hexString = new StringBuilder();
//            for (byte b : hash) {
//                String hex = Integer.toHexString(0xFF & b);
//                if (hex.length() == 1) {
//                    hexString.append('0');
//                }
//                hexString.append(hex);
//            }
//            return hexString.toString().toUpperCase();
//        } catch (NoSuchAlgorithmException e) {
//            e.printStackTrace();
//            return null;
//        }
//    }
//
//    // 序列化请求数据
//    private static String serialize(Object request) {
//        return new Gson().toJson(request);
//    }
//
//    // 反序列化
//    private static Map<String, String> deserialize(String value) {
//        Type type = new MethodDescription.TypeToken<Map<String, String>>() {}.getType();
//        return new Gson().fromJson(value, type);
//    }
//}